home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / help10.arc / HELP.8 next >
Text File  |  1987-03-06  |  11KB  |  248 lines

  1. ; HELP.COM by Bob Montgomery, 2/23/87
  2. ; This program is a generic help screen template for use with the A86
  3. ; assembler. The desired help message is written as db's at Hlpst in
  4. ; place of the test message that is there now. The only restrictions 
  5. ; on the help message are:
  6. ;    1. The message must not exceed 80 characters wide.
  7. ;    2. The message must not exceed 25 lines long.
  8. ;    3. Each help line must be the same length.
  9. ; The program will auto center the message on the display screen. The hot 
  10. ; key combo to bring up the help screen is defined as Hotkey below (set 
  11. ; for Cntl-Leftshift right now) and can be changed to another combination
  12. ; by changing the equate for Hotkey.
  13.  
  14.      jmp  Init           ;Initialize program
  15.  
  16. Esc  equ  1Bh
  17. Vidmem equ 0B800         ;Location of screen 0
  18. Monomem equ 0B000        ;Location of mono screen
  19. BWattr equ 70h           ;Grey background, black foreground
  20.  
  21. ; Bits in shift status
  22. Rtsh   equ 1
  23. Lftsh  equ 2
  24. Cntl   equ 4
  25. Alt    equ 8
  26. Scrl   equ 10h
  27. Numl   equ 20h
  28. Capl   equ 40h
  29.  
  30. Mode   db  ?             ;Current video mode
  31. Vpage  db  ?             ;Current video page
  32. Vidseg dw  ?             ;Current page segment
  33. Hlpflg db  0             ;1 => Help on
  34. Attr   db  ?             ;Attribute to use
  35. Cursor dw  ?             ;Current cursor type
  36.  
  37. ; ==================================================================
  38. ; This is the test help message to be displayed on the video screen.
  39. ; Change this area for your own help message, color, and hot key combo.
  40.  
  41. Colattr equ 4Eh          ;Red background, yellow foreground
  42. Hotkey equ Cntl+Lftsh    ;Define the hot key combo to bring up screen
  43.  
  44. Hlpst: db 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
  45. Linchr equ $-Hlpst       ;Chars on each help line
  46.      db   'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
  47.      db   'CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC'
  48.      db   'DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD'
  49.      db   'EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE'
  50.      DB   'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'
  51.      db   'GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG'
  52.      db   'HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH'
  53.      db   'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'
  54.      db   'JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ'
  55.      db   'KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK'
  56.      DB   'LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL'
  57.      DB   'MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM'
  58.      DB   'NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN'
  59.      DB   'OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO'
  60.      DB   'PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP'
  61.      DB   'QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ'
  62.      DB   'RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR'
  63.      DB   'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS'
  64.      DB   'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT'
  65.      DB   'UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU'
  66.      DB   'VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV'
  67.      DB   'WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW'
  68. ; ===================================================================
  69.  
  70. Msglen equ $-Hlpst       ;# chars in help buffer
  71. Lines equ Msglen/Linchr  ;# lines of help
  72. Buflen equ 2*Msglen      ;Screen data buffer length
  73. Stlin equ (25-Lines)/2   ;Start line
  74. Stchr equ (80-Linchr)/2  ;Start byte on line
  75. Stscr equ 160*Stlin + 2*Stchr ;Start of mem to put help
  76.  
  77. Scrbuf: db Buflen dup (?) ;Buffer for screen data
  78.  
  79. ; New Int 9 routine - check for Cntrl-LShift; ignore others.
  80. ; Since Int 9 is called every time a key is pressed or released, and
  81. ; reads the keyboard thru some mysterious means in BIOS, we must call
  82. ; the old Int 9 as a subroutine each time an Int 9 is generated. But,
  83. ; an interrupt routine has a IRET instead of a RET as the return
  84. ; instruction, which pops the return address like a RET does, and then
  85. ; pops the flags. So to call Int 9 like a subroutine, we have to push
  86. ; the flags first; then when the the IRET is executed, control returns
  87. ; to our program with the stack pointer at the right place.
  88.  
  89. Start: push ax,bx,cx,dx,ds,es,di,si ;Save all for calling program
  90.      pushf               ;Put flags on stack since Int pops flags
  91. Oldint: call 0000:0000   ;Call old Int 9 to get key-will pop flags
  92.      mov  ah,2           ;Get shift status
  93.      Int  16h            ;in al
  94.      and  al,Hotkey      ;Only keep Hot keys
  95.      cmp  al,Hotkey      ;Were both pressed?
  96.      jne  Exit           ;No
  97.      mov  ds,cs          ;Yes, set ds=cs
  98.      cmp  Hlpflg,1       ;Is help already up?
  99.      jne  Go             ;No, put it up
  100. ; If help is already up, ignore the Hotkey.
  101. Exit: pop si,di,es,ds,dx,cx,bx,ax ;Restore all for calling program
  102.      iret                ;Pop return address and flags
  103.  
  104. ; Come here if should put up help.
  105. Go:  mov  al,Colattr     ;Assume color
  106.      mov  Attr,al
  107.      mov  ah,15          ;Get video mode in al
  108.      int  10h            ;and page in bh
  109.      mov  Mode,al        ;Save Mode
  110.      mov  Vpage,bh       ;and page
  111.      cmp  al,2           ;Mode=2?
  112.      je   Color          ;Yes
  113.      cmp  al,3           ;Mode=3?
  114.      je   Color          ;Yes
  115.      cmp  al,7           ;Mode=7? (mono)
  116.      jne  Exit           ;No, must be graphics so exit
  117.      mov  al,BWattr      ;Set B&W attribute
  118.      mov  Attr,al
  119.      mov  bx,Monomem     ;and start of mono video memory
  120.      jmp  short A0
  121. Color: mov  bl,0         ;Bx=256*display page
  122.      add  bx,Vidmem      ;Get display mem segment
  123. A0:  mov  ds,bx          ;in ds
  124.  
  125. ; Put up help screen.
  126. ; First save current screen to buffer.
  127.      call Hidecur        ;Hide cursor
  128.      call Vidoff         ;Disable video (avoids snow on CGA)
  129.      mov  dl,Lines       ;Get # lines of help
  130.      mov  es,cs          ;es=cs
  131.      mov  si,Stscr       ;ds:si points to help screen area in disp mem
  132.      mov  di,Scrbuf      ;es:di points to buffer for screen data
  133.      push si,es,ds       ;Save them
  134.      mov  ch,0           ;ch=0
  135.      mov  cl,Linchr      ;cx=chars/help line
  136. A1:  push si,cx          ;Save position in scrn mem & chars/line
  137.      cld                 ;Set to inc si & di
  138.      rep  movsw          ;Move screen to buffer
  139.      pop  cx,si          ;Get start of line & chars/line
  140.      add  si,160         ;Next line, same column
  141.      dec  dl             ;Done all lines?
  142.      jne  A1             ;No
  143.  
  144. ; Now put up help.
  145.      pop  es,ds,di       ;Now ds=cs, es:di=help scrn area in screen mem
  146.      push di,ds,es       ;Put back in orig order
  147.      mov  si,Hlpst       ;Point si to help data
  148.      mov  dl,Lines       ;Get chars/help line
  149.      mov  ah,Attr        ;Get char attribute (color)
  150. B1:  push di,cx          ;Save disp mem pos & chars/help line
  151. B2:  lodsb               ;Get a help char in al
  152.      stosw               ;Save char & attribute in screen mem
  153.      loop B2             ;Do whole line
  154.      pop  cx,di          ;Get start of disp line & chars/line
  155.      add  di,160         ;Next line, same column
  156.      dec  dl             ;Done all lines?
  157.      jne  B1             ;No
  158.      mov  Hlpflg,1       ;Yes, indicate help up
  159.      call Vidon          ;and enable video
  160.  
  161. ; Now, wait for the escape key; come here after each keypress (Int 9).
  162. Wait1: mov ah,0          ;Wait for a key
  163.      int  16h
  164.      cmp  al,Esc         ;Was it Escape?
  165.      jne  Wait1          ;No
  166.  
  167. ; If Esc was pressed, put the old screen back
  168.      pop  es,ds,di       ;ds=cs; es:di=start of help area in disp mem
  169.      mov  si,Scrbuf      ;Point to old screen data buffer
  170.      call Vidoff         ;Disable video (avoid snow on CGA)
  171.      mov  dl,Lines       ;Chars/help line
  172. C1:  push di,cx          ;Save scrn mem pointer & chars/line
  173.      rep  movsw          ;Move a line to scrn mem
  174.      pop  cx,di          ;Get start of line & chars/line
  175.      add  di,160         ;Next line, same column
  176.      dec  dl             ;Done all lines?
  177.      jne  C1             ;No
  178.      mov  Hlpflg,0       ;Yes, clear flag
  179.      call Vidon          ;Enable video
  180.      call Showcur        ;Turn cursor back on
  181.      jmp  Exit           ;and return
  182.  
  183. ; Sub to turn cursor off; come with ds=video.
  184. Hidecur: push cx,ds
  185.      mov  ds,cs          ;ds=cs
  186.      mov  ah,3           ;Get current cursor data
  187.      mov  bh,Vpage       ;for current page
  188.      int  10h
  189.      mov  Cursor,cx      ;Save cursor type
  190.      mov  ch,20h         ;Set cursor off
  191.      mov  ah,1
  192.      int  10h
  193.      pop  ds,cx
  194.      ret
  195.  
  196. ; Sub to turn cursor on; come with ds=cs.
  197. Showcur: mov  cx,Cursor  ;Set original cursor Type
  198.      mov  bh,Vpage
  199.      mov  ah,1
  200.      int  10h
  201.      ret
  202.  
  203. ; Turn video off
  204. Vidoff: cs cmp  Mode,7   ;Mono?
  205.      je   D0             ;Yes, skip wait for vert retrace
  206.      push ds,dx,ax
  207.      call Getmode        ;Get current video mode byte
  208.      and  al,0F7         ;Clear video enable bit
  209.      out  dx,al          ;Send to mode control port
  210.      pop  ax,dx,ds
  211. D0:  ret
  212.  
  213. ; Turn video on
  214. Vidon: cs cmp  Mode,7    ;Mono?
  215.      je   E0             ;Yes, skip wait for vert retrace
  216.      push ds,dx,ax
  217.      call Getmode        ;Get current video mode byte
  218.      or   al,8           ;Set video enable bit
  219.      out  dx,al          ;Send to mode control port
  220.      pop  ax,dx,ds
  221. E0:  ret
  222.  
  223. ; Sub to wait for vertical retrace to avoid snow on CGA screen.
  224. Vert: mov dx,3DAh        ;CRT status port
  225. F1:  in   al,dx          ;Read status
  226.      test al,8           ;Vert retrace?
  227.      je   F1             ;No
  228.      mov  dx,3D8h        ;Point to video mode port
  229.      ret                 ;Yes, return
  230.  
  231. Getmode: call Vert       ;Wait for vert retrace
  232.      mov  ax,40h         ;Get video mode
  233.      mov  ds,ax          ;at 465h
  234.      mov  al,b[65h]
  235.      ret                 ;and return
  236.  
  237. ; Come here to install the program as the new Int 9 routine.
  238. Init: mov ax,3509h       ;Get current Int 9 vector
  239.      int  21h            ;in es:bx
  240.      mov  ds,cs          ;this code
  241.      mov  w[Oldint+1],bx ;Save it
  242.      mov  w[Oldint+3],es
  243.      mov  ax,2509h       ;Set new Int 9 routine
  244.      mov  dx,Start
  245.      int  21h
  246.      mov  dx,Init        ;Terminate and
  247.      int  27h            ;stay resident
  248.